// 封装axios
import store from '@/store'
import { logout, saveToken } from '@/store/actions/login'
import { ApiResponse } from '@/types/data'
import { Toast } from 'antd-mobile'
import axios, { AxiosError } from 'axios'
import history from './history'
import { getToken } from './storage'
// import { getToken } from './storage'

// 域名地址
export const realNameURL = 'http://toutiao.itheima.net'

// 服务器通用API地址
export const baseURL = 'http://geek.itheima.net/v1_0'

const request = axios.create({
  baseURL: baseURL,
  timeout: 5000,
})

// 添加请求拦截器
request.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    const token = getToken().token
    if (token) {
      config.headers!.Authorization = `Bearer ${token}`
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
request.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    return response
  },
  async function (error: AxiosError<{ message: string }>) {
    // 1.服务器繁忙,没有给你相应的情况
    if (!error.response) {
      Toast.show('服务器繁忙,请稍后再试')
      return Promise.reject(error)
    }

    // 2.401情况
    console.log(error)

    if (error.response.status === 401) {
      const token = getToken()
      // console.log(token)

      if (token.token) {
        // token存在,这里刷新token,需要使用原始的axios请求
        try {
          const res = await axios.request<ApiResponse<{ token: string }>>({
            method: 'put',
            url: baseURL + '/authorizations',
            headers: {
              Authorization: 'Bearer ' + token.refresh_token,
            },
          })
          // console.log(res)

          // 将token进行更新,更新到redux中
          store.dispatch(
            saveToken({
              token: res.data.data.token,
              refresh_token: token.refresh_token,
            })
          )

          // 直接的请求失败了,不能让用户刷新页面重新请求,我们应该重新请求
          // 将来发送请求发送失败的那次请求,重新发送一次
          return request(error.config)
        } catch (e) {
          console.log(e)
          store.dispatch(logout())
          history.replace({
            pathname: '/login',
            state: {
              from: history.location.pathname,
            },
          })
          Toast.show('登录过期,请重新登陆')
          return Promise.reject(error)
        }
      } else {
        // 直接拦截到登录页
        history.replace({
          pathname: '/login',
          state: {
            from: history.location.pathname,
          },
        })
        Toast.show('登录过期,请重新登陆')
        return Promise.reject(error)
      }
    }

    // 3.普通错误情况
    // 有响应,只不过响应错误,给用户提示即可
    Toast.show(error.response.data.message)

    // 对响应错误做点什么
    return Promise.reject(error)
  }
)

export default request
